home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / objtools / layer.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  7KB  |  375 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    layer -
  19.  *        View an sgi object interactively.
  20.  *
  21.  *            Paul Haeberli - 1990
  22.  */
  23. #include "stdio.h"
  24. #include "gl.h"
  25. #include "device.h"
  26. #include "sgiobj.h"
  27.  
  28. /*
  29.  *    layer support follows
  30.  *
  31.  */
  32. float fgetmousex();
  33. float fgetmousey();
  34. float flerp();
  35.  
  36. sgiobj* obj;
  37. int shownormals;
  38. int showlines;
  39. int showcolors;
  40. int showmeshs;
  41. int menu;
  42. int envmap;
  43.  
  44. main(argc,argv)
  45. int argc;
  46. char **argv;
  47. {
  48.     short val;
  49.     float zfactor;
  50.  
  51.     if(argc<2) {
  52.     fprintf(stderr, "usage: layer object [environ.rgb]\n");
  53.     exit(1);
  54.     }
  55.     obj = readsgiobj(argv[1]);
  56.     if(!obj) {
  57.     fprintf(stderr, "layer: can't read %s\n",argv[1]);
  58.     exit(1);
  59.     }
  60.     zfactor = 5.0;
  61.     initwindow();
  62.     trackztrans(-3.0);
  63.     if(argc>=3) {
  64.     if(getgdesc(GD_TEXTURE)) {
  65.         textureread(argv[2],1);
  66.         envmap = 1;
  67.     } else {
  68.         fprintf(stderr, "layer: no texturing on this machine - oh well\n");
  69.     }
  70.     }
  71.     qmouse();
  72.     qdevice(ESCKEY);
  73.     qdevice(UPARROWKEY);
  74.     qdevice(DOWNARROWKEY);
  75.     while(1) {
  76.     while(qtest()) {
  77.         switch(qread(&val)) {
  78.           case ESCKEY:
  79.                     exit(0);
  80.                     break;
  81.         case LEFTMOUSE:
  82.             if(val) {
  83.             trackclick();
  84.             while(getbutton(LEFTMOUSE)) { 
  85.                 trackpoll();
  86.                 drawit(obj);
  87.             }
  88.             }
  89.             break;
  90.         case MIDDLEMOUSE:
  91.             if(val) {
  92.             trackclick();
  93.             while(getbutton(MIDDLEMOUSE)) {
  94.                 trackpoll();
  95.                 drawit(obj);
  96.             }
  97.             }
  98.             break;
  99.         case MENUBUTTON:
  100.             if(val) {
  101.             switch(dopup(menu)) {
  102.                 case 1:
  103.                 shownormals = 1-shownormals;
  104.                 break;
  105.                 case 2:
  106.                 showlines = 1-showlines;
  107.                 break;
  108.                 case 3:
  109.                 showcolors = 1-showcolors;
  110.                 break;
  111.                 case 4:
  112.                 savewindow("save.rgb");
  113.                 printf("saved image to save.rgb\n");
  114.                 break;
  115.                 case 6:
  116.                 showmeshs = 1-showmeshs;
  117.                 break;
  118.             }
  119.             }
  120.             break;
  121.         case UPARROWKEY:
  122.             if(val) {
  123.             zfactor *= 1.41;
  124.             }
  125.             break;
  126.         case DOWNARROWKEY:
  127.             if(val) {
  128.             zfactor /= 1.41;
  129.             }
  130.             break;
  131.  
  132.         }
  133.     }
  134.     drawit(obj);
  135.     }
  136. }
  137.  
  138. initwindow()
  139. {
  140.     keepaspect(5,4);
  141.     winopen("layer");
  142.     if(obj->objtype == OBJ_TRIMESH)
  143.     menu = defpup("layer %t|toggle normals|toggle lines|toggle color|save image|save lenticular|toggle showmeshs");
  144.     else
  145.     menu = defpup("layer %t|toggle normals|toggle lines|toggle color|save image|save lenticular");
  146.     matrixinit();
  147.     mygfxinit();
  148.     backface(0);
  149.     renderfperspective(25.0,5.0/4.0,0.3,20.0); 
  150.     shadeinit();
  151. }
  152.  
  153. clearback()
  154. {
  155.     shadeoff();
  156.     cpack(0x000000);
  157.     clear();
  158. }
  159.  
  160. float circpos[4] = { 0.5, 0.5, 0.020, 0.030 };
  161. float rectpos[4] = { 0.3, 0.2,-0.015,-0.025 };
  162.  
  163. zsetrect(val)
  164. int val;
  165. {
  166.     long xsize, ysize;
  167.     int x1, x2, y1, y2;
  168.  
  169.     getsize(&xsize,&ysize); 
  170.     ortho(-0.5,xsize-0.5,-0.5,ysize-0.5,-1.0,1.0);
  171.     wmpack(0x00000000);
  172.  
  173.     zfunction(ZF_ALWAYS);
  174.  
  175. /* outer rectangle */
  176.     x1 = 0;
  177.     x2 = xsize-0;
  178.     y1 = 0;
  179.     y2 = ysize-0;
  180.     setz(val==0);
  181.     rectfi(x1,y1,x2,y2);
  182.  
  183. /* circle with wire frame */
  184.     setz(val==1);
  185.     x1 = circpos[0]*xsize;
  186.     y1 = circpos[1]*ysize;
  187.     circf(x1,y1,xsize*0.12);
  188.     circ(x1,y1,xsize*0.12);
  189.  
  190. /* rectangle with normals */
  191.     setz(val==2);
  192.     x1 = (rectpos[0]-0.2)*xsize;
  193.     x2 = (rectpos[0]+0.2)*xsize;
  194.     y1 = (rectpos[1]-0.2)*ysize;
  195.     y2 = (rectpos[1]+0.2)*ysize;
  196.     rectfi(x1,y1,x2,y2);
  197.     recti(x1,y1,x2,y2);
  198.  
  199. /* draw outlines */
  200.     wmpack(0xffffffff);
  201.     cpack(0xff0000ff);
  202.     zfunction(ZF_LEQUAL);
  203.  
  204.     fsetdepth(0.002,0.003);
  205.     if(val == 1) {
  206.     x1 = circpos[0]*xsize;
  207.     y1 = circpos[1]*ysize;
  208.     circ(x1,y1,xsize*0.12);
  209.     }
  210.     if(val == 2) {
  211.     x1 = (rectpos[0]-0.2)*xsize;
  212.     x2 = (rectpos[0]+0.2)*xsize;
  213.     y1 = (rectpos[1]-0.2)*ysize;
  214.     y2 = (rectpos[1]+0.2)*ysize;
  215.     recti(x1,y1,x2,y2);
  216.     }
  217.     fsetdepth(0.000,1.000);
  218.     zfunction(ZF_LEQUAL);
  219. }
  220.  
  221. setz(val)
  222. int val;
  223. {
  224.     if(val)
  225.     fsetdepth(0.999,1.000);
  226.     else
  227.     fsetdepth(0.000,0.001);
  228. }
  229.  
  230. drawit(obj)
  231. sgiobj *obj;
  232. {
  233.     float m[4][4];
  234.  
  235.     gettracktransform(m);
  236.     reshapeviewport();
  237.  
  238.     clearback();
  239.  
  240. /* draw it normal */
  241.     showlines = 0;
  242.     shownormals = 0;
  243.  
  244.     zsetrect(0);
  245.     renderfperspective(25.0,5.0/4.0,0.3,20.0); 
  246.     pushmatrix();
  247.     multmatrix(m);
  248.     drawtheobj(obj);
  249.     popmatrix();
  250.  
  251. /* draw it as lines */
  252.     showlines = 1;
  253.     shownormals = 0;
  254.  
  255.     zsetrect(2);
  256.     renderfperspective(25.0,5.0/4.0,0.3,20.0); 
  257.     pushmatrix();
  258.     multmatrix(m);
  259.     drawtheobj(obj);
  260.     popmatrix();
  261.  
  262. #ifdef NOTDEF
  263. /* draw it as normal with normals */
  264.     showlines = 0;
  265.     shownormals = 1;
  266.  
  267.     zsetrect(1);
  268.     renderfperspective(25.0,5.0/4.0,0.3,20.0); 
  269.     pushmatrix();
  270.     multmatrix(m);
  271.     drawtheobj(obj);
  272.     popmatrix();
  273. #endif
  274.  
  275. /* draw it zoomed up in size */
  276.     showlines = 0;
  277.     shownormals = 1;
  278.  
  279.     zsetrect(1);
  280.     renderfperspective(25.0,5.0/4.0,0.3,20.0); 
  281.     zoomwindow(2.0,circpos[0],circpos[1]);
  282.     pushmatrix();
  283.     multmatrix(m);
  284.     drawtheobj(obj);
  285.     popmatrix();
  286.  
  287.     swapbuffers();
  288.  
  289.     updatepos(circpos);
  290.     circpos[0] = fgetmousex();
  291.     circpos[1] = fgetmousey();
  292.     updatepos(rectpos);
  293. }
  294.  
  295. zoomwindow(zfactor,xpos,ypos)
  296. float zfactor;
  297. float xpos, ypos;
  298. {
  299.     float l, r, b, t, near, far;
  300.     float tl, tr, tb, tt;
  301.     float delx, dely, cenx, ceny;
  302.     float shiftx, shifty;
  303.  
  304.     getrenderwindow(&l,&r,&b,&t,&near,&far);
  305.     cenx = flerp(l,r,xpos);
  306.     tl = cenx+((l-cenx)/zfactor);
  307.     tr = cenx+((r-cenx)/zfactor);
  308.     ceny = flerp(b,t,ypos);
  309.     tb = ceny+((b-ceny)/zfactor);
  310.     tt = ceny+((t-ceny)/zfactor);
  311.     renderwindow(tl,tr,tb,tt,near,far);
  312. }
  313.  
  314. updatepos(pos)
  315. float pos[4];
  316. {
  317.     pos[0] = pos[0]+pos[2];
  318.     if(pos[0]>1.0 || pos[0]<0.0)
  319.     pos[2] = -pos[2];
  320.     pos[1] = pos[1]+pos[3];
  321.     if(pos[1]>1.0 || pos[1]<0.0)
  322.     pos[3] = -pos[3];
  323. }
  324.  
  325. drawtheobj(obj)
  326. sgiobj *obj;
  327. {
  328.     srand(3);
  329.     if(showlines) {
  330.     cpack(0x40ffffff);
  331.     drawsgiobj(obj,DRAW_LINES);
  332.     } else {
  333.     if(envmap) {
  334.        cpack(0xffffff);
  335.         texgen(TX_S, TG_SPHEREMAP, 0);
  336.         texgen(TX_T, TG_SPHEREMAP, 0);
  337.         texgen(TX_S, TG_ON, NULL);
  338.         texgen(TX_T, TG_ON, NULL);
  339.         drawsgiobj(obj,DRAW_POINTS|DRAW_NORMALS);
  340.         texgen(TX_S, TG_OFF, NULL);
  341.         texgen(TX_T, TG_OFF, NULL);
  342.     } else {
  343.         shadeon();
  344.         setdiffuse(0.0,0.6,0.0);
  345.         setspecular(0.9,0.9,0.9);
  346.         lmcolor(LMC_DIFFUSE);
  347.         if(showmeshs) 
  348.         drawsgiobjmeshs(obj);
  349.         else if(showcolors)
  350.         drawsgiobj(obj,DRAW_POINTS|DRAW_NORMALS|DRAW_COLORS);
  351.         else 
  352.         drawsgiobj(obj,DRAW_POINTS|DRAW_NORMALS);
  353.         lmcolor(LMC_COLOR);
  354.         shadeoff();
  355.     }
  356.     }
  357.     if(shownormals) {
  358.     cpack(0x0000ff);
  359.     drawsgiobjnorms(obj);
  360.     }
  361. }
  362.  
  363. mygfxinit()
  364. {
  365.     zbuffer(1);
  366.     subpixel(1);
  367.     RGBmode();
  368.     doublebuffer();
  369.     gconfig();
  370.     cpack(0x808080);
  371.     clear();
  372.     swapbuffers();
  373.     fsetdepth(0.0,1.0);
  374. }
  375.